/*************************************************************
* Strip Packing Problem
* 
*
* */
#ifndef PSO_H
#define PSO_H

   #include <iostream>
   #include <fstream>
   #include <string>
   #include <list>
   #include <vector>
   #include "rectangulo.h"
   #include "heuristica.h"
   #include "solucion.h"
   

   #define maxS 50
   #define TAM_ENTORNO 5
   
   using namespace std;

   /** Clase Heurística:
    *    La idea es dejar esta clase como padre y derivar las distintas
    *    heurísticas a partir de esta. Podríamos implementar aquí las
    *    funciones comunes, como las reglas de parada, y en las clases
    *    hija las no comunes, como la actualización de la solución.
    *    
    * */
   class PSO : public Heuristica {
      protected:
         Contenedor C;
         int S; //Tamaño del enjambre
         vector <Solucion> particulas; //Solución actual de c/partícula
         //vector <int>        v; //Velocidades
         vector <int>        x; //Posiciones
         vector <Solucion>   b; //Mejores
         //int g; //Mejor = g* = Heuristica::mejorSol
      public:

         /**
         * Constructor por defecto. 
         * En principio no se usa.
         * */
         PSO();
         
         ~PSO();

         /** Constructor
         * @param listado de los rectángulos a empaquetar
         * */
         PSO(list<Rectangulo> lista_in, Contenedor & C_);

		  /** Generar solución inicial 
		  * Hay que generar S soluciones iniciales y asignarle
		  * a cada partícula sus datos necesarios
		  * */
         virtual list<Rectangulo> generaInicial();


         virtual bool parada(int valor);



         /** 
         * Modificar la solución 
         * 
         * • Búsqueda local
         * • Estructura de entorno
         * • Muestreo en el entorno
         * */
         virtual list<Rectangulo> mejoraSolucion();
         

         /**
          * Devuelve la mejor partícula del entorno:
          * */    
         Solucion minimoDelEntorno(int i);


   };

#endif
